package com.emerquim.bean.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.faces.model.SelectItem;

import org.apache.log4j.Logger;

/**
 * Clase para traer la informacion de los departamentos y municipios de la base
 * de datos
 * @author Felipe Criales
 */
public class DepartamentosDAO {
	
	/**
	 * Funcionalidad de log
	 */
	private static final Logger log = Logger.getLogger(DepartamentosDAO.class);

	// ---------------------------------------------
	// Constantes
	// ---------------------------------------------
	/**
	 * La constante para el sql de la lista de departamentos
	 */
	public final static String SQL_DEPARTAMENTOS = "SELECT DEP_ID, DEP_DESC FROM P_DEPARTAMENTO ORDER BY DEP_DESC ASC";
	
	/**
	 * La constante para el sql de la lista de municipios
	 */
	public final static String SQL_MUNICIPIOS = "SELECT MUN_ID, MUN_DESC FROM P_MUNICIPIO WHERE DEP_ID = ? ORDER BY MUN_DESC ASC";
	
	// ---------------------------------------------
	// Atributos
	// ---------------------------------------------
	/**
	 * La lista de los tipos de eventos
	 */
	private ArrayList<SelectItem> departamentos;
	
	/**
	 * Constructo de la clase
	 */
	public DepartamentosDAO(){
		this.departamentos = this.darListaDepartamentos();
	}
	
	/**
	 * Retorna la lista de departamentos de la base de datos
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> darListaDepartamentos() {
		ArrayList<SelectItem> departamentos = new ArrayList<SelectItem>();
		Connection conexion = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
			conexion = ConexionJDBC.getSingleton().getConnection();		
			preparedStatement = conexion.prepareStatement(this.SQL_DEPARTAMENTOS);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				int id_departamento = resultSet.getInt("DEP_ID");
				String desc_departamento = resultSet.getString("DEP_DESC");
				departamentos.add(new SelectItem(id_departamento, desc_departamento));
			}			
		} catch (Exception e) {
			log.error("Error al listar los departamentos de la base de datos");
			e.printStackTrace();
		}
		finally {
			ConexionJDBC.close(resultSet);
			ConexionJDBC.close(preparedStatement);	
			ConexionJDBC.close(conexion);
		}		
        return departamentos;
    }
	
	/**
	 * Retorna la lista de municipios dependiendo del valor del departamento
	 * @param id_departamento El identificador del departamento
	 * @author Felipe Criales
	 */
	public ArrayList<SelectItem> getMunicipios(int id_departamento) {
		ArrayList<SelectItem> municipios = new ArrayList<SelectItem>();
		Connection conexion = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
			conexion = ConexionJDBC.getSingleton().getConnection();		
			preparedStatement = conexion.prepareStatement(this.SQL_MUNICIPIOS);
			preparedStatement.setInt(1, id_departamento);
			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				int id_municipio = resultSet.getInt("MUN_ID");
				String desc_municipio = resultSet.getString("MUN_DESC");
				municipios.add(new SelectItem(id_municipio, desc_municipio));
			}
		} catch (Exception e) {
			log.error("Error al listar los municipios de la base de datos");
			e.printStackTrace();
		}
		finally {
			ConexionJDBC.close(resultSet);
			ConexionJDBC.close(preparedStatement);	
			ConexionJDBC.close(conexion);
		}		
        return municipios;
    }	
	
	/**
	 * Retorna la lista de los departamentos
	 */
	public ArrayList<SelectItem> getDepartamentos() {
		return this.departamentos;
	}
}
